package com.xinqi.modules.course.clazz.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.user.Account;
import com.xinqi.modules.course.clazz.domain.ClassEntity;
import com.xinqi.modules.course.clazz.dto.req.*;
import com.xinqi.modules.course.clazz.dto.rsp.*;
import com.xinqi.modules.stats.assistant.dto.req.RemindCheckDTO;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.util.List;

/**
 * 班级表服务层
 *
 * @author: system
 * @date: 2023/01/17
 */
public interface ClassService {
    /**
     * 分页查询 班级表数据
     */
    PageInfo<ClassResultDTO> page(Param pageable, ClassQueryDTO query);

    /**
     * 查询 班级表数据
     */
    List<ClassResultDTO> find(ClassQueryDTO query);

    /**
     * 根据id查询 班级表数据
     */
    ClassResultDTO findById(Long id);

    Boolean isExistsByName(Long courseId, String name, Long id);

    /**
     * 新增 班级表数据
     */
    Long insert(ClassCreateDTO dto);

    List<Long> insertNew(List<ClassCreateDTO> classList);

    /**
     * 创建群聊(熟悉新奇)
     *
     * @author dzy
     */
    void createClassChatGroup(ClassEntity entity, List<Long> studentIds, Long userId);

    // 生成班级信息
    List<Long> insert(List<ClassCreateDTO> classList);

    Boolean updateById(ClassUpdateDTO dto);

    /**
     * 根据id删除 班级表数据
     */
    Boolean deleteById(Long id);

    /**
     * 根据id删除 班级表数据
     */
    Boolean deleteById(ClassDeleteDTO dto);

    List<ClassResultDTO> findByCourseId(Long id);

    /**
     * 查询课程下的我管理的班级（剔除当前班级） -- 老师、助教
     *
     * @param classId
     * @param studentId
     * @return
     */
    List<ClassResultDTO> findMyCreateClassByClassId(Long classId, Long studentId);

    Boolean closeCountLimit(Long classId);

    Boolean openCountLimit(ClassCountLimitUpdateDTO dto);

    Boolean allowDropClass(Long id);

    Boolean forbidDropClass(Long id);

    Boolean update(Account user, Long courseId, List<ClassUpdateDTO> classList);

    List<Long> updateNew(Account user, Long courseId, List<ClassUpdateDTO> classList);

    void batchDeleteClassAndSubInfo(Account user, Long courseId, List<Long> classIdList);

    ClassResultDTO findDetail(ClassQueryDTO query);

    Boolean isNameEditable(Long id);

    List<ClassResultDTO> findByCourseIdAndIsTeacher(Long courseId, Long classId, Long studentId, Integer isTeacher, Integer isArchive);

    List<ClassResultDTO> findByCourseIdAndRoles(Long id, Long classId, Long studentId, List<String> classRoles, Integer isArchive);

    ClassResultDTO resetCode(Long id);

    ClassResultDTO closeCode(Long id);

    ClassResultDTO openCode(Long id);

    ClassResultDTO findByCode(String code);

    ClassResultDTO findClassInfoByClassId(Long classId);

    ClassAppResultDTO findClassInfoByCode(String courseCode);

    ClassTeacherResultDTO findTeacherByClassId(Long classId);

    List<ClassResultDTO> findOtherClasByClassId(Long classId);

    Boolean quitClass(Account user, Long id, String smsCode, String mobile);

    Integer batchQuitClass(Account user, Long classId, List<Long> classStudentIds);

    void deleteByCourseId(Account user, Long courseId);

    void cascadeDeleteByClassIds(Account user, List<Long> classIds);

    /**
     * 学生加课数量
     *
     * @param userId
     * @return
     */
    Integer findAddedClassCountByUserId(Long userId);

    List<ClassEntity> findByIdList(List<Long> classIdList);

    /**
     * 转移课程下的班级
     *
     * @param courseId  课程id
     * @param classList 班级列表
     */
    @Transactional(rollbackFor = Exception.class)
    void transferCourseClassList(Long courseId, Long userId, List<ClassEntity> classList);

    ClassResultDTO findByClassId(Long classId);

    /**
     * 根据用户ID班级ID获取课程 班级 学生信息
     */
    ClassAllResultDTO classAllMessage(Long classId);

    /**
     * 根据用户ID 用户角色 班级ID 课程内容ID 课程内容类型 获取课程 班级 学生信息
     */
    ClassAllResultDTO classAllMessage(Long classId, Integer messageType, Long contentId, String classRole);

    /**
     * 新奇提醒 -- 点击跳转时校验使用
     * 校验课程是否存在、班级是否存在、学生是否存在、选择校验课程内容是否存在
     * 返回课程信息、班级信息、学生信息
     *
     * @param dto
     * @return
     */
    ClassAllResultDTO classAllMessage(RemindCheckDTO dto);

    /**
     * 根据课程id和用户id查询班级列表及在班级中的角色
     *
     * @param courseId  课程id
     * @param userId    用户id
     * @param isArchive 是否归档
     * @return List<ClassResultDTO>
     */
    List<ClassResultDTO> findArchivedClassAndRoleByCourseIdAndStudentId(Long courseId, Long userId, Integer isArchive);

    /**
     * 同步示范课程
     *
     * @param entity 班级数据
     */
    Long insert(ClassEntity entity);

    /**
     * 批量保存，包含新增和更新
     *
     * @param entityList
     */
    Boolean updateBatch(List<ClassEntity> entityList);

    /**
     * 在未登录的情况下，根据加课码获取班级信息
     *
     * @param courseCode 加课码
     * @return ClassAppResultDTO
     */
    ClassAppResultDTO findClassInfoByCodeSimple(String courseCode);

    ShareClassResultDTO shareClassInfo(Long classId);

    ClassAuditContentResultDTO getAuditContentInfo(Long classId) throws IOException;

}
